#include <iostream>
using namespace std;
class date{
    public:
    void print()
    {
        printf("%d %d %d\n", _year, _month, _day);
    }
    date(int year = 2023, int month = 9, int day = 17)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    //== 重载私有和公有都可以访问
    bool operator==(const date &d2){
        return _year == d2._year && _month == d2._month && _day == d2._day;
    }
    //=赋值运算符只能是成员函数
    date &operator=(const date &d2) // d1 = operator(d1,d2);
    {
        if (*this != d2)
        {
            _year = d2._year;
            _month = d2._month;
            _day = d2._day;
        }
        return *this;    //返回d1的引用,减少拷贝的次数
    }
    // 前置++：返回+1之后的结果
    // 注意：this指向的对象函数结束后不会销毁，故以引用方式返回提高效率
    date &operator++()
    {
        _day += 1;
        return *this;
    }
    // 后置++：
    // 前置++和后置++都是一元运算符，为了让前置++与后置++形成能正确重载
    // C++规定：后置++重载时多增加一个int类型的参数，但调用函数时该参数不用传递，编译器自动传递
    // 注意：后置++是先使用后+1，因此需要返回+1之前的旧值，故需在实现时需要先将this保存一份，然后给this + 1
    //       而temp是临时对象，因此只能以值的方式返回，不能返回引用

     date operator++(int)
    {
        date temp(*this);
        _day += 1;
        return temp;
    }

    public:
        int _year;
        int _month;
        int _day;
    };
// 只能访问public的公有
// bool operator==(const date& d1,const date &d2){
//     return d1._year == d2._year && d1._month == d2._month && d1._day == d2._day;
// }


int main(){
    date d1(2022, 9, 12);
    date d2(2022, 9, 17);
    cout << (d1 == d2) << endl;    //打印的结果是:0

    //没用报错是因为c++里面有默认重载的运算符，默认对自定义类型一般不适用，要自己实现
    date d3;
    d3 = d1;
    d3.print();

    return 0;
}